package com.obelisco.modelo.dao.hibernate;

import java.io.Serializable;
import java.util.List;
import java.util.ResourceBundle;

import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.modelo.dao.IUsuarioDAO;
import com.obelisco.modelo.data.Usuario;

public class UsuarioDAO extends HibernateDAO  implements
		IUsuarioDAO {

	public Usuario findByPK(Serializable clave) {
		try {
			Usuario data = (Usuario) super.getSession().load(Usuario.class, clave);
			return data.getEstado().equals("B") ?  null : data;			
		} catch (RuntimeException re) {
			throw re;
		}
	}

	public List loadAll() {
		try {
			List lista = this.find("from Usuario usuario where usuario.estado != 'B'");
			return lista;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	public void delete(Usuario usuario) {
		// TODO Auto-generated method stub
		if (usuario.getDesistema().booleanValue()) {
			throw new ObeliscoException(
					"NO se puede eliminar un Usuario de Sistema");
		} else {
			getHibernateTemplate().delete(usuario);
		}
	}

	ClassValidator usuarioValidator = new ClassValidator(Usuario.class,ResourceBundle.getBundle("com.obelisco.modelo.data.hibernate-validator"));
	
	public void validate(Usuario objeto) {

		InvalidValue[] validationMessages =  usuarioValidator.getInvalidValues(objeto);

		StringBuffer errores = new StringBuffer();
		for (int i = 0; i < validationMessages.length; i++) {
			InvalidValue value = validationMessages[i];
			errores.append(value.getPropertyName() + " - "+ value.getMessage() + "<br/>");
		}

		if (errores.length() > 0) {
			throw new ObeliscoException(errores.toString());
		}		

	}
	
	public void save(Usuario objeto) {		
		validate(objeto);
		try {
			this.saveOrUpdate(objeto);
		} catch (RuntimeException re) {
			throw re;
		}
	}

	public List findByProperty(String nombre, Object valor) {
		try {
			String queryString = "from Usuario as modelo where modelo."
					+ nombre + "= ?";
			return find(queryString, valor);
		} catch (RuntimeException re) {
			throw re;
		}
	}


}
